import axios from 'axios'
import router from '@/router'
import { useUserStore } from '@/stores/index'
import { useExamStore } from '@/stores/modules/exam-student'

const mockURL = 'https://m1.apifoxmock.com/m1/6158840-5850879-default'
export const localURL = 'http://localhost:8080'

// 是否使用本地mock数据(true: 使用本地mock, false: 使用实际接口)
export const USE_MOCK = false

/**
 * 创建axios实例
 */
const service = axios.create({
  baseURL: localURL,
  timeout: 15000 // 请求超时时间
})

// 处理mock数据
// 注意：导入放在service创建之后，确保mock拦截器能够正确处理请求
// import './mock-interceptor'  // 导入mock拦截器
// import { disableMockInterceptor } from './mock-interceptor'

// // 如果不使用本地mock，禁用mock拦截器
// if (!USE_MOCK) {
//   disableMockInterceptor()
// }

// 定义错误消息映射
const ERROR_MESSAGES = {
  400: '请求参数错误',
  401: '登录已过期，请重新登录',
  403: '权限不足，请联系管理员',
  404: '请求的资源不存在',
  500: '服务器错误，请稍后重试'
}

/**
 * 请求拦截器
 */
service.interceptors.request.use(
  config => {
    const userStore = useUserStore()

    // 添加token到请求头
    if (userStore.token) {
      config.headers['authorization'] = `${userStore.token}`
    }

    return config
  },
  error => {
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

/**
 * 响应拦截器
 */
service.interceptors.response.use(
  response => {
    // 业务code处理
    const { code, message, data } = response.data

    // 请求成功
    if (code === 200) {
      return { code, data, message }
    }

    // 单独处理 401 未授权情况
    if (code === 401) {
      handleUnauthorized()
    }

    const errorMessage = message || '请求失败'
    ElMessage.error(errorMessage)

    return Promise.reject(new Error(message || '请求失败'))
  },
  error => {
    const requestPath = error.config?.url?.replace(error.config.baseURL, '');

    // 排除登录接口的401处理
    if (requestPath === '/student/auth/login' && error.response?.status === 401) {
      return Promise.reject(error.response?.data || error);
    }

    const status = error.response?.status

    // 如果没有响应状态码，可能是网络错误
    if (!status) {
      ElMessage.error('网络连接失败')
      return Promise.reject(new Error('网络连接失败'))
    }

    // 显示对应的错误信息
    const errorMessage = ERROR_MESSAGES[status] || `请求失败(${status})`
    ElMessage.error(errorMessage)

    return Promise.reject(error)
  }
)

/**
 * 处理未授权情况（401）
 */
const handleUnauthorized = () => {
  ElMessage.error('登录已过期，请重新登录')
  const userStore = useUserStore()
  const userExam = useExamStore()

  userStore.logout()
  userExam.clearAllExamData()
  router.push('/login')
}

export default service